package main

import (
	"fmt"
)

func main() {
	//死锁1
	//单go程自己死锁，channel应该至少在2个以上的go程中进行通信，否则死锁
	//examble1()

	//死锁2
	//go程间channel访问顺序导致死锁，使用channel一端读(写)，要保证另一端写(读)操作，同时有机会执行，否则死锁
	//examble2()

	//死锁3
	examble3()
}

func examble1() {
	ch := make(chan int)
	ch <- 78

	num := <-ch
	fmt.Println(num)
}

func examble2() {
	ch := make(chan int)
	num := <-ch //这里从channel中读取数据会阻塞，下面创建go程的代码就不执行了，就不会往channel里写数据
	fmt.Println("num=", num)

	go func() {
		ch <- 789
	}()
}

func examble3() {
	ch1 := make(chan int)
	ch2 := make(chan int)

	go func() {
		for {
			select {
			case val := <-ch1:
				fmt.Println(val)
				ch2 <- 10
			}
		}
	}()

	for {
		select {
		case <-ch2:
			ch1 <- 20
		}
	}
}
